/*
  将下面异步代码使用 Promise 的方法改进
  尽量用看上去像同步代码的方式
  setTimeout(function () {
    var a = 'hello'
    setTimeout(function () {
      var b = 'lagou'
      setTimeout(function () {
        var c = 'I ♥ U'
        console.log(a + b +c)
      }, 10)
    }, 10)
  }, 10)
*/

/**----------------------------------------------------- */
// 方法三：使用async/await
function declare(str) {
    return new Promise((resolve, reject) => {
        var a = str;
        resolve(a);
    });
}

async function printFn() {
    try {
        const str1 = await declare('hello');
        const str2 = await declare('lagou');
        const str3 = await declare('I ♥ U');
        console.log(str1 + str2 + str3);
    } catch (error) {
        console.log(error);
    }
}

printFn();

/**----------------------------------------------------- */
// 需求，a,b,c依次声明，最后打印
// 方法一：使用Promise
// let print = new Promise((resolve, reject) => {
//     var a = 'hello';
//     resolve(a);
// });
// print
//     .then(a => {
//         var b = 'lagou';
//         return a + b;
//     })
//     .then(ab => {
//         var c = 'I ♥ U';
//         console.log(ab + c);
//     })
//     .catch(e => {
//         console.log(e);
//     });
/**----------------------------------------------------- */

// 方法二：使用genrator生成遍历器对象
// 1.定义一个声明字符串变量的异步函数
// 2.定义一个genrator遍历器对象生成函数
// 3.使用yield来对遍历器对象状态进行标记
// 4.调用printFn生成遍历对象器
// 5.使用.next()执行，得到一个对象，对象value值为yield传递的promise对象，其中promise对象的value值为传递的值
// 6.调用promise对象.then方法，依次执行yield标记语句
// function declare(str) {
//     return new Promise((resolve, reject) => {
//         var a = str;
//         resolve(a);
//     });
// }

// function* printFn() {
//     const str1 = yield declare('hello');
//     const str2 = yield declare('lagou');
//     const str3 = yield declare('I ♥ U');
//     console.log(str1 + str2 + str3);
// }

// let print = printFn();
// const result = print.next();
// result.value.then(value => {
//     const result2 = print.next(value);
//     if (result2.done) return;
//     result2.value.then(value => {
//         const result3 = print.next(value);
//         result3.value.then(value => {
//             print.next(value);
//         });
//     });
// });

/**----------------------------------------------------- */
// 使用递归函数改进上方代码
// 定义一个递归函数，如果.next()里done值为true，则return，否则递归调用
// function declare(str) {
//     return new Promise((resolve, reject) => {
//         var a = str;
//         resolve(a);
//     });
// }

// function* printFn() {
//     try {
//         const str1 = yield declare('hello');
//         const str2 = yield declare('lagou');
//         const str3 = yield declare('I ♥ U');
//         console.log(str1 + str2 + str3);
//     } catch (error) {
//         console.log(error);
//     }
// }

// function printResult(result) {
//     if (result.done) return;
//     result.value.then(
//         value => {
//             printResult(print.next(value));
//         },
//         error => {
//             print.throw(new Error(error));
//         }
//     );
// }

// let print = printFn();
// const result = print.next();
// printResult(result);
